{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import rcParams\n",
    "rcParams[\"font.sans-serif\"] = [\"SimHei\"]# 指定中文字体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>date</th>\n",
       "      <th>price</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>sqft_living</th>\n",
       "      <th>sqft_lot</th>\n",
       "      <th>floors</th>\n",
       "      <th>waterfront</th>\n",
       "      <th>view</th>\n",
       "      <th>condition</th>\n",
       "      <th>grade</th>\n",
       "      <th>sqft_above</th>\n",
       "      <th>sqft_basement</th>\n",
       "      <th>yr_built</th>\n",
       "      <th>yr_renovated</th>\n",
       "      <th>zipcode</th>\n",
       "      <th>lat</th>\n",
       "      <th>long</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>2005-10-24</td>\n",
       "      <td>476315.91</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>1921</td>\n",
       "      <td>1856</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>1864</td>\n",
       "      <td>87</td>\n",
       "      <td>1979</td>\n",
       "      <td>2010</td>\n",
       "      <td>98001</td>\n",
       "      <td>47.341860</td>\n",
       "      <td>-122.183176</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1937-07-18</td>\n",
       "      <td>698980.64</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>1503</td>\n",
       "      <td>6659</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>2177</td>\n",
       "      <td>100</td>\n",
       "      <td>1937</td>\n",
       "      <td>0</td>\n",
       "      <td>98010</td>\n",
       "      <td>47.532967</td>\n",
       "      <td>-122.026116</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>2008-08-01</td>\n",
       "      <td>663024.75</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>3494</td>\n",
       "      <td>3112</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "      <td>12</td>\n",
       "      <td>2030</td>\n",
       "      <td>1084</td>\n",
       "      <td>1968</td>\n",
       "      <td>1989</td>\n",
       "      <td>98006</td>\n",
       "      <td>47.345444</td>\n",
       "      <td>-121.635418</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>2011-08-31</td>\n",
       "      <td>629698.77</td>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>2618</td>\n",
       "      <td>8264</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>1576</td>\n",
       "      <td>1108</td>\n",
       "      <td>1911</td>\n",
       "      <td>1999</td>\n",
       "      <td>98010</td>\n",
       "      <td>47.749573</td>\n",
       "      <td>-121.794627</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>2011-02-26</td>\n",
       "      <td>658139.54</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1661</td>\n",
       "      <td>3386</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>517</td>\n",
       "      <td>816</td>\n",
       "      <td>1900</td>\n",
       "      <td>0</td>\n",
       "      <td>98001</td>\n",
       "      <td>47.737984</td>\n",
       "      <td>-121.701806</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9995</th>\n",
       "      <td>9996</td>\n",
       "      <td>1953-07-11</td>\n",
       "      <td>303685.99</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>2378</td>\n",
       "      <td>6259</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>13</td>\n",
       "      <td>2398</td>\n",
       "      <td>450</td>\n",
       "      <td>1927</td>\n",
       "      <td>1992</td>\n",
       "      <td>98010</td>\n",
       "      <td>47.394280</td>\n",
       "      <td>-121.689675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9996</th>\n",
       "      <td>9997</td>\n",
       "      <td>2016-01-03</td>\n",
       "      <td>336882.94</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>4837</td>\n",
       "      <td>6226</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>8</td>\n",
       "      <td>2198</td>\n",
       "      <td>1567</td>\n",
       "      <td>1986</td>\n",
       "      <td>2006</td>\n",
       "      <td>98003</td>\n",
       "      <td>47.530260</td>\n",
       "      <td>-122.444554</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9997</th>\n",
       "      <td>9998</td>\n",
       "      <td>2021-11-12</td>\n",
       "      <td>423961.29</td>\n",
       "      <td>4</td>\n",
       "      <td>4</td>\n",
       "      <td>4750</td>\n",
       "      <td>1641</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>2442</td>\n",
       "      <td>380</td>\n",
       "      <td>2018</td>\n",
       "      <td>0</td>\n",
       "      <td>98004</td>\n",
       "      <td>47.020433</td>\n",
       "      <td>-122.275511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9998</th>\n",
       "      <td>9999</td>\n",
       "      <td>1969-09-03</td>\n",
       "      <td>394782.02</td>\n",
       "      <td>6</td>\n",
       "      <td>5</td>\n",
       "      <td>4108</td>\n",
       "      <td>7847</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>4226</td>\n",
       "      <td>1899</td>\n",
       "      <td>1912</td>\n",
       "      <td>0</td>\n",
       "      <td>98001</td>\n",
       "      <td>47.034089</td>\n",
       "      <td>-122.122351</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9999</th>\n",
       "      <td>10000</td>\n",
       "      <td>1999-11-20</td>\n",
       "      <td>738484.49</td>\n",
       "      <td>8</td>\n",
       "      <td>6</td>\n",
       "      <td>3533</td>\n",
       "      <td>7641</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>937</td>\n",
       "      <td>250</td>\n",
       "      <td>1979</td>\n",
       "      <td>0</td>\n",
       "      <td>98008</td>\n",
       "      <td>47.158349</td>\n",
       "      <td>-121.876240</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10000 rows × 19 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         id        date      price  bedrooms  bathrooms  sqft_living  \\\n",
       "0         1  2005-10-24  476315.91         8          4         1921   \n",
       "1         2  1937-07-18  698980.64         4          4         1503   \n",
       "2         3  2008-08-01  663024.75         3          3         3494   \n",
       "3         4  2011-08-31  629698.77         8          1         2618   \n",
       "4         5  2011-02-26  658139.54         1          2         1661   \n",
       "...     ...         ...        ...       ...        ...          ...   \n",
       "9995   9996  1953-07-11  303685.99         3          2         2378   \n",
       "9996   9997  2016-01-03  336882.94         2          1         4837   \n",
       "9997   9998  2021-11-12  423961.29         4          4         4750   \n",
       "9998   9999  1969-09-03  394782.02         6          5         4108   \n",
       "9999  10000  1999-11-20  738484.49         8          6         3533   \n",
       "\n",
       "      sqft_lot  floors  waterfront  view  condition  grade  sqft_above  \\\n",
       "0         1856       3           0     0          3      7        1864   \n",
       "1         6659       2           0     1          1      7        2177   \n",
       "2         3112       2           0     3          4     12        2030   \n",
       "3         8264       1           0     2          4      7        1576   \n",
       "4         3386       1           0     3          3      2         517   \n",
       "...        ...     ...         ...   ...        ...    ...         ...   \n",
       "9995      6259       1           0     4          4     13        2398   \n",
       "9996      6226       2           1     2          1      8        2198   \n",
       "9997      1641       2           1     1          2      1        2442   \n",
       "9998      7847       1           0     4          3      1        4226   \n",
       "9999      7641       3           0     0          3      2         937   \n",
       "\n",
       "      sqft_basement  yr_built  yr_renovated  zipcode        lat        long  \n",
       "0                87      1979          2010    98001  47.341860 -122.183176  \n",
       "1               100      1937             0    98010  47.532967 -122.026116  \n",
       "2              1084      1968          1989    98006  47.345444 -121.635418  \n",
       "3              1108      1911          1999    98010  47.749573 -121.794627  \n",
       "4               816      1900             0    98001  47.737984 -121.701806  \n",
       "...             ...       ...           ...      ...        ...         ...  \n",
       "9995            450      1927          1992    98010  47.394280 -121.689675  \n",
       "9996           1567      1986          2006    98003  47.530260 -122.444554  \n",
       "9997            380      2018             0    98004  47.020433 -122.275511  \n",
       "9998           1899      1912             0    98001  47.034089 -122.122351  \n",
       "9999            250      1979             0    98008  47.158349 -121.876240  \n",
       "\n",
       "[10000 rows x 19 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('./data/house_sales.csv')\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "is_executing": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "500836.078454\n",
      "501404.45999999996\n",
      "100111.33236672153\n",
      "100000.0\n",
      "841466.39\n",
      "count     10000.000000\n",
      "mean     500836.078454\n",
      "std      100111.332367\n",
      "min      100000.000000\n",
      "25%      432656.315000\n",
      "50%      501404.460000\n",
      "75%      568049.522500\n",
      "max      841466.390000\n",
      "Name: price, dtype: float64\n"
     ]
    }
   ],
   "source": [
    "#平均值\n",
    "mean=data['price'].mean()\n",
    "print(mean)\n",
    "\n",
    "#中位数\n",
    "median=data['price'].median()\n",
    "print(median)\n",
    "\n",
    "#标准差\n",
    "price_std = data[\"price\"].std()\n",
    "print(price_std)\n",
    "\n",
    "#最小值\n",
    "price_min = data[\"price\"].min()\n",
    "print(price_min)\n",
    "\n",
    "#最大值\n",
    "price_max = data[\"price\"].max()\n",
    "print(price_max)\n",
    "\n",
    "#四分位数\n",
    "price_stats = data[\"price\"].describe()\n",
    "print(price_stats)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "✅ 筛选后有效数据：10000 条记录，16 个特征\n",
      "\n",
      "📊 各特征与房价（price）的皮尔逊相关系数：\n",
      "------------------------------------------------------------\n",
      "特征名称            相关系数       关系强度       关系方向\n",
      "------------------------------------------------------------\n",
      "yr_built        0.0133        几乎无相关      正相关\n",
      "sqft_living     0.0073        几乎无相关      正相关\n",
      "grade           0.0068        几乎无相关      正相关\n",
      "bedrooms        0.0054        几乎无相关      正相关\n",
      "sqft_lot        0.0051        几乎无相关      正相关\n",
      "bathrooms       0.0035        几乎无相关      正相关\n",
      "condition       0.0027        几乎无相关      正相关\n",
      "waterfront      0.0027        几乎无相关      正相关\n",
      "view            0.0018        几乎无相关      正相关\n",
      "sqft_basement   0.0015        几乎无相关      正相关\n",
      "sqft_above      0.0003        几乎无相关      正相关\n",
      "lat             0.0002        几乎无相关      正相关\n",
      "yr_renovated    -0.0044        几乎无相关      负相关\n",
      "floors          -0.0074        几乎无相关      负相关\n",
      "long            -0.0079        几乎无相关      负相关\n",
      "------------------------------------------------------------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\conda\\Lib\\site-packages\\IPython\\core\\events.py:93: UserWarning: Glyph 8722 (\\N{MINUS SIGN}) missing from current font.\n",
      "  func(*args, **kwargs)\n",
      "D:\\software\\conda\\Lib\\site-packages\\IPython\\core\\pylabtools.py:152: UserWarning: Glyph 8722 (\\N{MINUS SIGN}) missing from current font.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "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il3fix239v65oC064nEr9jzuCB35XN0Tj0FL9qbzYmfbfiwWLFgQW7Zs2a+Pxa5wvt5ZaWcPgDx16dKlwy9y+7PXX389jjnmmBg8eHAMHjy4s4ezy15//fU47rjj4qCDDoqDDjqow++vtLQ0Kioq9th+7J/29LqGPaG91/dc/1ywLz2P94bHYF86nrtq+7Ho27dvdO/ePXr37t3ZQ2JfkcjCD3/4w3T00UcXvq+vr09lZWXpmWeeSZ/61KfSrFmz0m233ZYOP/zw9K1vfavF3zdv3rx08sknpw9/+MOpV69e6ZxzzkmvvPJKSimlxYsXpxEjRjS6fUSkF154ofD9Cy+8kJpbPk1t++xnP5siotHXZz/72VbOvvWauu+nnnoqvf/9708VFRXpnHPOSatXr04p/XWev/jFL9Lw4cNTVVVVuuWWWwr7PfHEE+noo49OBx54YLr88svTEUcckb75zW/u9jHvaOHChTsdpyOOOKLo/IrNsaVtxdbOPffck4488sjUs2fPNG7cuLRixYomf5ZSSt/97nfT4MGD04gRI9KXvvSlwvqZPXv2TvOZMGFCSimlCRMm7LRt9uzZrT5WTa3TYtuuu+669IlPfKLw/ZNPPpn69u2b3n777aL7zZs3L40fPz7deuutacCAAal///7pzjvvLGy///7708EHH5wGDx6cpk+fnoYOHZp+8YtfNPodza2l8ePHp3nz5qWbbropDR8+vNF+//f//t902GGHpfLy8nTqqaemNWvWFLZ9//vfT0OGDEmDBg1KV1xxRaMxL1q0KI0aNSpVVlamSy65JL311lstHcpmFTtPPProo+mEE05IFRUV6cMf/nD685//3KrxFZvzkiVL0pgxY1JVVVWaNm1aqqmpaXHbiBEj0mc/+9l00EEHpa985Stp8uTJqV+/fmnp0qUppZRuu+22NGLEiFReXp7OPvvs9Nprr+00zxzW9ZIlS9KwYcNSly5dCvOvr69PXbp02en++vXr16rrQErFzwHNPcYtPSeae6xaeg42t+abO6bb1+e4ceNSly5dUmlpabrwwgvTW2+9lX7961+nMWPGpG7duqXS0tI0dOjQ9MUvfjENGjSo2WtRS9eEYseqPefg8ePHp4suuigNHTo0fepTn0qf+cxnUmVlZbrrrrtSSn9dl2VlZemAAw5I5eXlady4cenpp58u+ntbmsddd92VDj300NS3b980a9asna4p7b2Gt/b6dOihh6b7778/XXvttSki0u2335569+6dunfvnr70pS+lMWPGpJ49e6bjjz8+PfXUU626/2Lno+bOOcWex8X2S6n5NV7subGr54aUUvrRj36UPvCBDxS+r6mpSWVlZenVV18t+hg0dXy2bt2aevXqlVauXJm+8Y1vpH79+qWUUjrvvPPSTTfdtFecF2fNmpUmTZqUxo8fn3r37p0uvPDC9MYbbxS2F7tOFjv3/+AHP0jV1dXpwAMPTDNmzEjbtm0rHLsvf/nLqX///ulb3/pWOuqoo9J73vOe9POf/zwdeeSRqVu3bql79+6pX79+6eabby4ci7KysnTqqaem8vLyVF5enoYNG7bTfIt9tXYdNDfflo5Te8/Ju/PPE9s1tUa3n6/b+rzfnwn4TNTW1qaysrL0xz/+MaWU0h133JHGjBmTUnrnDxUnnXRSOvnkk9Mvf/nLRn9waM68efNSRKSvfvWraeXKlWnixInp/PPPTyl1TMBv3rw51dTUpPe///3pO9/5TqqpqUmbN29u5exb7933XV9fnwYNGpSuvvrqtGrVqvQP//AP6X3ve1/aunVrWrx4cTrggAPSySefnJ566ql0yy23pO7duxfGdfLJJ6frr78+PfHEE6mioiI99NBDaePGjbt9zDv6y1/+kmpqatIVV1xROMnW1dU1O7+W5lhsW0rF185BBx2Uvv71r6fVq1enf/iHf0gXXHBBkz977LHHUllZWbrrrrvSU089laqrqwvr56233ko1NTVp2rRp6Yorrkg1NTWFi8obb7yRampq0rBhw9Jdd92Vampq2nRxaGvA//GPf0z9+/cvzP1f//Vf00UXXdTifvPmzUv9+vVLEyZMSM8++2yaPn16GjZsWEoppW3btqXBgwen2267LS1evDj16tUrPfvss40es5SaX0vjx49PJ510Upo4cWK655570oYNG1JKKb3++uupe/fu6Qc/+EFat25d+tu//dv0uc99LqWU0rJly1JZWVn6+c9/np588sk0cuTIwphXrFiRunfvnubOnZtWrFiR3vve96Zrr7221cf03Zo7T9TU1KQDDzwwXXPNNenFF19MEyZMSJdcckmL40spNTvnl156KfXq1SvdeuutaeXKlWnSpElpypQpLW4bMWJEuuCCC9K3v/3tFBHppz/9aTrllFPSddddl+rr61NpaWlauHBhWrVqVTr33HPTlVdeudM89/Z1vX3+289Rp512WpoyZUq644470jHHHJNqampSeXl5OuKII9LYsWPTz372s1ZdB1Jq/hxQ7DEu9pwo9lgVew4WW/PNHdPt67Nr167phhtuSKeddlqqqqpK11xzTRowYED6+Mc/niorK9NHPvKRdNJJJ6W+ffumD3zgA81ei1q6JjR3rNp7Dh4/fnz64Ac/mH72s5+liEjf/OY308c//vH06U9/urAur7322tSvX780duzYNHny5PRP//RPacyYMe2+tr388supvLw83Xrrrem5555LY8eObVXAt+Ya3trrU58+fdJ3vvOd9JnPfCZ16dIlHXPMMem0005LF1xwQYqINGvWrLR+/fr0pS99KZ199tkt3n+xtZpS8+ecYs/jYvsVW+PFnhu7em5I6Z0/C5aXlxcC7I477kinnnpq0ceg2PE5+eST06JFi9JnP/vZ9P73vz+99tpracyYMem//uu/9orz4va/YPrf//t/pz/96U/puOOOS9OnT08pFT9nFDv3//rXv07du3dPv/zlL9NTTz2Vhg4dmm677bbCsdv+PDzwwAPT0qVLU+/evVPfvn3TBRdckCorK9OUKVPSmWeemXr27Jm6d++e7rrrrnT88cenrl27pj59+qTnnnsuHXHEEWn69Olp2rRp6R//8R/TwoUL05AhQ1JNTU1as2ZN2rhxY5uPRbH5FjtO7T0n7+4/T2z37jW6devWNGDAgHTddde16Xm/vxPwGZkyZUr62te+llJK6cILL0zXX399SumdP1QMGDCg0d84t2TevHlp0KBBhSftY489lkpLS9OWLVs6JOC32/432h3l3ff94x//OB1++OGF7996663Uu3fv9PDDD6fFixeniEjLli1LKaXU0NCQIiKtWrUqpZRSz54905/+9KeUUkonnXRS+vGPf9xh4363WbNmpU996lM7/bypY1tsjsW2pVR87Rx88MHpuuuuS3V1dWnbtm1py5YtTf5s5syZhYtBSin9+7//+07rZ/srV00ZMWJEWrx4cfED0oS2BnxKKR199NHp0UcfTSmldPrppxde6Sq237x581KPHj3Syy+/nFJK6U9/+lPhMXjllVdSRKSGhoaUUkoDBw5MDz300E7329xaGj9+fBo1alT6y1/+0uj2f/nLX9LLL7+cNm3alJYsWZLOPffcdPrpp6eUUrr66qvTueeeW7jtd7/73cKYr7322nTiiScWtv3bv/1bGjt2bJPHqDWaO0/Mnz8/DRw4MG3bti2llNLdd9+d+vfv3+L4is35+uuvTx/60IcK369duzZFRFq/fn3RbSNGjEiLFi1KixcvTgcddFBK6a/rbfPmzalnz55p/vz5afPmzWnbtm2Fuexob1/XO85/ypQp6YorrkgRkT784Q8XrgO9evVKffr0adN1IKXmzwG33XZbs49xsedEsccqpeafg8XW/HbvPqbz5s1LvXv3TieccEJK6Z312aVLl3T88cen9evXp0984hPpvPPOSxdffHE65JBD0le+8pU0fvz4lFLT16KWrgnNHav2noPHjx+fvve97xXO62+++Wajc//BBx+czj///HT44YcX1uXGjRvT7bff3u5r2/z589OoUaMK+/3qV79qVcBvV+wa3trrU1lZWbrgggvS2WefnSIiXX/99ek973lPeuyxx1JEpD/+8Y/pkUceKTxuLd1/sbW6fZ+mzjnbNfc8bs+5qthzY7v2nhu2mzhxYrrjjjtSSin9/d//faN/CdLUY1Ds+Fx22WXplltuSeecc0666qqr0oMPPpgOOOCAVFNTs1ecF2fNmtXomnbnnXemkSNHppSKnzOKnfsvueSS9LGPfazwO6+88sp0/vnn7/Q83H6bESNGpIEDB6ZDDjkk/Y//8T8Kx+Loo49O1dXVKaV31sp73/vewrGYMWNGuuiiiwrHoqnzeluPRbH5FjtO7T0n7+4/T2zXVMCvX78+bd68uU3P+/2dD7HLyEc/+tH46U9/Gm+//Xb86le/io9+9KOFbZ/85CejsrKyTb9vxIgR0aXLO0tg+PDhsWXLlnjttdd2ut3mzZt3beCdaPXq1TFy5MjC92VlZTF48ODCJ4H26dMnxowZExER3bt3j4iIlFJERFRXV8fDDz8cGzdujOeeey7e85737OHRt06xObY0/4jm187ChQvjgQceiEGDBsUHPvCBePzxx5v82auvvtroffojRozooJnuuvPOOy8WLVoUmzZtiieffDI+9KEPtWq/o446qvBevu3rJCLiwAMPjKqqqnj44Ydj5cqVUVtbG9XV1TvtX2wtfe5zn4tu3bo1un1KKa688soYPHhwXHnllbFly5bYunVrRESsX78+hg0bVrjtIYccUvj/a9eujccffzyqqqqiqqoqvvzlL8dLL73Uqjk2p6nzxMsvvxwbNmyIPn36RFVVVZx//vmxYcOGeOutt4qOr9icV69e3ei2gwcPjrKyssI6bm5bRESPHj0a/e92PXv2jDvvvDNuvfXW6N+/f5x99tnx/PPP7zSevX1d7zj/j370o3HfffdF9+7d47777mt0HTjrrLPafB2IaPocsHbt2mYf44jmnxMtPVbNPQeLrfliysvL4w9/+ENUVVXF6aefHtu2bYtVq1bFnDlz4vbbb4+HH344amtrY+vWrU2uxXcrdk1o7ljtyjl4xzX77vW7cOHC+MMf/hArV64srMs+ffrExz72sXZf21rz/Nydmhpn//7949lnn43XXnstevfuHZs2bYq1a9cWxnviiSfG5z//+cLj1pKW1mpE0+ec1mjruSqi+efG7rL9ORQRce+998aHP/zhorcvdnyOPfbYePbZZ2PLli1xxBFHxOLFi2PAgAFRVVW115wXd1w/w4cPj/Xr10dE8XNGsXP/2rVr4+c//3nhOnnLLbc0uk42dT2ZOXNmvPzyy3HzzTdHt27dorKyMp555plG54aTTjqp8P+7d+/eaNvu0NI5srnj1N5zckf8eaIpXbp0iTlz5sSQIUPa9Lzf3wn4jEyePDmWL18e8+bNi+rq6jj00EML23r16tXm37dmzZrCCWbt2rXRtWvXOPDAA6OkpKTRk2fp0qW7Pvj/p0uXLrv9pFbM8OHD44UXXih8/9Zbb8W6desKn+pe7APLjj766PjSl74UAwcOjE9+8pOFP1zsbYrNsaX5RzS9djZt2hSbNm2Ke++9NzZu3Bgf/OAH46KLLtrpZ3//938fgwYNavQXAk0FUjF7ck185CMfiUWLFsV//dd/xYc+9KEoKytr1X7NrZNt27bFcccdF3/zN38T73nPe+JrX/ta9O/ff6fbFVtLTR3/H//4x7FkyZJYs2ZNPPTQQzFp0qTCtgEDBsS6desK3+94QR06dGhMnjw5li1bFsuWLYsnnngi7r333lbNsTlNnScGDhwYxx9/fKP7+cMf/hDdunUrOr5icx4+fHijtbN27dpoaGgorOPmthXz+uuvR58+feK3v/1tvPLKKzFgwIC4/PLLG92mqbW+t63rHec/efLk+O///u/4y1/+EoccckjhOlBSUtLq9fxuTT0eQ4cObfYxjmj+OdHSY9Xcc7DYmt+uqWP65ptvxqRJk2LZsmWxcOHC6Nq1a1x//fXxve99L6ZOnRrnnXdeXHLJJRHReC029/i09CGWza3dXTkHN2X7uvzqV78ahx56aGFdvvHGGzFq1Kh2X9ta8/wspq3ruqlx/vnPf45XXnkltm3bFpWVlXH33XdHdXV1/Pa3v42Id6J06dKlhcetpftvaa1GtO/PSM3t19Iab2kN7eq5YcqUKXH//ffHU089FUOHDo0hQ4YUvX2x43PsscfGI488Er17947DDjssfv7zn8exxx67V50Xd7y/tWvXFv5ypNg5o9i5f+jQofG5z32u0fH4wQ9+0Oz9b9u2Ld58880YN25czJ49Oz7zmc/E0KFD47LLLmv0FxibNm1q07zbeixaOkc2d5zae07uiD9PNOWBBx6I733ve/HMM8+06Xm/vxPwGTnggAPinHPOia985SvxsY99bJd/35o1a+LrX/96rFq1Kr761a/GueeeG6WlpTF06NBYv359rFy5MjZt2hRXX331rg/+/6muro777rsv1q9fH/fdd1+H/y3bueeeG/X19XHNNdfEiy++GP/4j/8Yhx12WIwdO7bofs8//3z8+te/jt/+9rexcuXKmDNnToeOc1cUm2N7579t27aYOHFi/OhHP4rXXnstunTpElu3bt3pZ9u2bYspU6bEvffeG//5n/8ZTz/9dNx4441tGn91dXXcfffdsX79+rj//vt35VC06Jhjjona2tr40Y9+FB/5yEd2+ff95je/iY0bN8bSpUvjpZde2ikOI9q3lt54442IiNi4cWMsWrQorr322sLFa8qUKXHPPffEr371q/jv//7v+PrXv17Yb9q0afGb3/wmnnvuuYiIuOWWW+Liiy/epTk2dZ6YMmVKvPjii/Hoo49G165d4/bbb4+zzz47UkpFx1fMJz7xiXjooYfi+9//frzwwgtx6aWXxtSpU+Oggw4quq2Y1157Lc4444y4++67o66urrBmd9TUWt/b1vWO89+wYUNUVVVFaWlpfOITnyjcpnfv3rFixYrd9jyaOHFis49xa8fa1GPV3HOw2JrfrqljWldXF/fcc0/85je/iW9+85sxfPjw+Jd/+ZeIiDjllFNi/vz5cemll0ZDQ0N8//vfb/S7dte1qCPPwW+88UZs3LgxHnnkkWhoaIjrrruucC5uz++dMGFC/OlPf4of/OAHsXLlyjZf39t63Jqa/+GHHx5dunSJysrK6Nq1a6xcuTLe9773FdZAfX19/Pa3v41/+qd/anINvPv+27tW26u956Md57Ar54Y+ffrEkUceGbNnz27VdazY8Rk1alQ8+eSTcdhhh8Vhhx0Wv//97+N973vfXnVefOihh+JHP/pRrFixIr7+9a/H1KlTI6L4OaPYuf+Tn/xk/OIXv4iXX345tmzZEv/8z/8c//zP/1x0DDNmzIjq6upYsGBBvP3227Fly5Z46KGHYsmSJfGf//mfsWnTprj77rub3f+QQw6JdevWxe9///tYsWJF/OEPf2jzsWjpHNnccWrvObkj/jxRbF61tbVtet7v9zr8H+mzW/2f//N/UklJSXrxxRcLPyv2fqPmzJs3L40dOzZNmjQpVVRUpLPOOiutW7eusP3LX/5yGjhwYHrve9+b7r///t32HviXXnopvf/9709lZWWpurq62fektVdT9/3kk0+mcePGpd69e6ezzz57p0/q3dH2eW7dujUde+yxqW/fvqlr166pR48ee/STL9vyHviUmp9jS9uKrZ0777wzHXnkkalHjx5p1KhRacmSJU3+LKV33gc3ePDgNHLkyDR9+vQ2vSfuiSeeSKNHj05lZWXpgx/8YPEDs4P2vAc+pXfem9azZ8+0adOmVu23/VOFt9vxMaivr09Dhw5Nffv2TSUlJal3797pmmuuabR/sbXU3Pu6amtr01lnnZXKy8vTiSeemGbNmpUGDBiQ3nzzzZTSXz8FePjw4Y0+BTilv35qbHl5eTrttNPSs88+2+RxaI1i54ntn2pcXl6exo4dm373u98V9is2vmLvZXvggQfSmDFjUmVlZbrgggsafQp9c9u2v49wx8dux/X2ne98Jx188MGpR48e6cQTTyx8gveOcljXO85/3LhxO10HJk+enAYMGNDm+ys2h+Ye42LPiXeP9d2PY0pNPwdbWvMp7XxMt6/PE088MXXp0iV16dIljRs3Li1fvjxdeOGFqVevXmnAgAGpvLw8RUS68MILC+Nu6lrU0ue/FDtW7TkHb38u7Hj8djz3b1+X3bt3Tz179kw9e/ZM48ePT88880zR39vSPH7605+mkSNHpoEDB6bp06e36T3wxa7hbbk+TZ48Of3d3/1dGjFiRDr++OPT9773vfT222+niEjl5eVp1KhR6cYbb0ylpaWF95MXu/9i56OW3j9b7D3wbT1XtfTcSKn954Yd/fu//3uKiPT88883+nlLn0Lf1PEZPXp0mjt3bkoppX79+qVFixallPaO8+KsWbPS2WefnU455ZRUUVGRPvaxj6Xa2tqUUsvnjGLn/vnz56fq6up0wAEHpClTpqRXXnml2efhiBEj0tVXX52OPPLIVFpamrp165Z69eqVPvWpT6VvfetbafDgwalHjx7pnHPOKRyL7fvveCzmzJmTDjzwwNS7d+/07W9/u83Hoth8ix2nlNp3Tk5p9/55Yrt3r9G33367cL5u6/N+f1aSkn+TkIvnn38+fvOb38T3v//9ePDBBzt7OPu0uXPnxh133BH/8R//EeXl5fHEE0/E3/zN38Srr77qvxPeggceeCAuuuiiWLVqVWcPpcPNnDkz1qxZE1/72teie/fuce+998YXvvCFeP311wu3sZb2DXvLunYdAPYWe8t5cW/gWLAnlXb2AGi9qVOnxquvvhp33nlnq25fVVXV5M8PP/zwePTRR3fjyPY9p59+evz4xz+OUaNGxZtvvhkjR46Mm266SXDtAS+99FKMHj26yW1nnnlm/OQnP9nDI2re1KlT4/Of/3wcfvjhsWXLljj88MPj3/7t3xrdxloiYveta9cBYF+R0/W+ozkWtIVX4Pdhzf0tYLdu3Vr80BPoLFu2bIk1a9Y0ua1nz56tfp8h7E06a127DgB7K9f7v3IsaAsBDwAAABnwKfQAAACQAQEPAAAAGRDwAAAAkAEBDwAAABkQ8AAAAJABAQ8AAAAZEPAAAACQgf8fPvsi8oLEyBcAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1200x800 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "numeric_features = [\n",
    "        \"price\", \"bedrooms\", \"bathrooms\", \"sqft_living\", \"sqft_lot\",\n",
    "        \"floors\", \"waterfront\", \"view\", \"condition\", \"grade\",\n",
    "        \"sqft_above\", \"sqft_basement\", \"yr_built\", \"yr_renovated\",\n",
    "        \"lat\", \"long\"\n",
    "    ]\n",
    "\n",
    "  # 过滤数据：仅保留数值型特征，且剔除含缺失值的行\n",
    "data = data.dropna()\n",
    "print(f\"\\n✅ 筛选后有效数据：{data_numeric.shape[0]} 条记录，{data_numeric.shape[1]} 个特征\")\n",
    "\n",
    "\n",
    "# 3. 计算皮尔逊相关系数（核心步骤）\n",
    "# corr(method=\"pearson\")：默认计算皮尔逊相关系数，仅衡量线性关系\n",
    "correlation_with_price = data_numeric.corr()[\"price\"].sort_values(ascending=False)\n",
    "# 排除自身（price与price的相关系数为1，无分析意义）\n",
    "correlation_with_price = correlation_with_price.drop(\"price\")\n",
    "print(f\"\\n📊 各特征与房价（price）的皮尔逊相关系数：\")\n",
    "print(\"-\" * 60)\n",
    "print(f\"{'特征名称':<15} {'相关系数':<10} {'关系强度':<10} {'关系方向'}\")\n",
    "print(\"-\" * 60)\n",
    "\n",
    "\n",
    " # 定义相关系数强度判断标准\n",
    "def get_correlation_strength(coef):\n",
    "    abs_coef = abs(coef)\n",
    "    if abs_coef >= 0.7:\n",
    "        return \"强相关\"\n",
    "    elif abs_coef >= 0.3:\n",
    "        return \"中等相关\"\n",
    "    elif abs_coef >= 0.1:\n",
    "        return \"弱相关\"\n",
    "    else:\n",
    "        return \"几乎无相关\"\n",
    "    \n",
    "for feat, coef in correlation_with_price.items():\n",
    "    strength = get_correlation_strength(coef)\n",
    "    direction = \"正相关\" if coef > 0 else \"负相关\"\n",
    "    print(f\"{feat:<15} {coef:.4f} {'':<6} {strength:<10} {direction}\")\n",
    "print(\"-\" * 60)\n",
    "\n",
    "\n",
    "\n",
    "# 5. 可视化：柱状图展示相关系数（更直观）\n",
    "plt.figure(figsize=(12, 8))\n",
    "# 按相关系数绝对值排序，便于观察强相关特征\n",
    "corr_sorted = correlation_with_price.reindex(correlation_with_price.abs().sort_values(ascending=False).index)\n",
    "# 绘制柱状图：正相关用蓝色，负相关用红色\n",
    "colors = [\"#2E86AB\" if coef > 0 else \"#A23B72\" for coef in corr_sorted.values]\n",
    "bars = plt.bar(corr_sorted.index, corr_sorted.values, color=colors, alpha=0.8)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
